package org.yak.core.utils;

import java.io.File;
import java.io.FileInputStream;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.yak.core.exception.ServiceException;

/**
 *
 * @平台：FAMSUN统一开发平台
 * @文件名称：ConfigUtils.java
 * @文件描述：config配置文件工具类
 * @author xq
 * @日期：2017年12月11日上午9:45:26
 *
 */
@SuppressWarnings("rawtypes")
public class ConfigUtils {

	private static final Logger logger = Logger.getLogger(ConfigUtils.class);

	private static final Map<String,String> configProy = new HashMap<String,String>();

	static{
		try{
			String configPath = Thread.currentThread().getContextClassLoader().getResource("/config.properties").getPath();
			configPath = URLDecoder.decode(configPath, "UTF-8");
			logger.error("config地址："+configPath);
			File file = new File(configPath);
			if(file.exists()){
				Properties pro = new Properties();
				pro.load(new FileInputStream(file));
				Iterator<Entry<Object, Object>> it=pro.entrySet().iterator();
				while(it.hasNext()){
					Map.Entry entry=(Map.Entry)it.next();
					String key = String.valueOf(entry.getKey());
					String value = String.valueOf(entry.getValue());

					configProy.put(key.toUpperCase(), value);
				}

			}else{
				logger.error("config.properties文件不存在");
			}
		}catch(Exception e){
			logger.error("加载系统配置文件异常",e);
		}
	}

	/**
	 * 获取资源文件路径
	 * @方法没描述：
	 * @author XQ
	 * @param fileName
	 * @return
	 */
	public static String getRecourcePath()throws Exception{
		String path = Thread.currentThread().getContextClassLoader().getResource("/").getPath();
		path = URLDecoder.decode(path, "UTF-8");
		return path;
	}

	/**
	 * 获取资源文件路径
	 * @方法没描述：
	 * @author XQ
	 * @param fileName
	 * @return
	 */
	public static String getRecourcePath(String fileName)throws Exception{
		String path = Thread.currentThread().getContextClassLoader().getResource("/"+fileName).getPath();
		path = URLDecoder.decode(path, "UTF-8");
		return path;
	}

	/**
	 *
	 * @方法没描述：获取配置文件值
	 * @author xq
	 * @param key
	 * @return
	 */
	public static String getConfigValue(String key){
		String keyInfo = key.toUpperCase();
		if(configProy.containsKey(keyInfo)){
			return configProy.get(keyInfo);
		}else{
			logger.error("查询config.properties文件，key="+key+",值不存在");
			return null;
		}
	}

	/**
	 *
	 * @方法没描述：查询文件上传，下载目录
	 * @author xq
	 * @return
	 */
	public static String getFileUploadDir(){
		String file_upload_dir = getConfigValue("file_upload_dir");
		if(StringUtils.isEmpty(file_upload_dir)){
			throw new ServiceException("没有配置上传文件路径，无法上传文件");
		}
		File file = new File(file_upload_dir);
		if(!file.exists()){
			file.mkdirs();
		}
		return file_upload_dir;
	}
	
	public static String getFileExportDir() {
		String file_export_dir = getConfigValue("exp_file_dir");
		if(StringUtils.isEmpty(file_export_dir)){
			throw new ServiceException("没有配置下载文件路径，无法生成下载文件");
		}
		File file = new File(file_export_dir);
		if(!file.exists()){
			file.mkdirs();
		}
		return file_export_dir;
	}

	/**
	 * 核心池的大小 运行线程的最大值
	 * @方法没描述：
	 * @author xq
	 * @return
	 */
	public static int getThreadCorePoolSize(){
		return (getConfigValue("thread.corePoolSize")==null? 0 : Integer.parseInt(getConfigValue("thread.corePoolSize")));
	}

	/**
	 *
	 * @方法没描述：创建线程最大值
	 * @author xq
	 * @return
	 */
	public static int getThreadMaximumPoolSize(){
		return (getConfigValue("thread.maximumPoolSize")==null? 0 : Integer.parseInt(getConfigValue("thread.maximumPoolSize")));
	}

	/**
	 *
	 * @方法没描述：线程没有执行任务时 被保留的最长时间 超过这个时间就会被销毁 直到线程数等于
	 * @author xq
	 * @return
	 */
	public static int getThreadKeepAliveTime(){
		return (getConfigValue("thread.keepAliveTime")==null? 0 : Integer.parseInt(getConfigValue("thread.keepAliveTime")));
	}
}
